;	PDP-11/05 PROTOTYPE CONTROL STORAGE DUBUGGING PROGRAM

;	BY JEFF SCOTT



;	REGISTER DEFINITIONS AND OTHER GOODIES LIKE TTY 
;	ADDRESSES AND THE LIKE

R0	=	%0	;GENERAL REGISTER 0
R1	=	%1	;GENERAL REGISTER 1
R2	=	%2	;GENERAL REGISTER 2
R3	=	%3	;GENERAL REGISTER 3
R4	=	%4	;GENERAL REGISTER 4
R5	=	%5	;GENERAL REGISTER 5
SP	=	%6	;PROCESSOR STACK REGISTER
PC	=	%7	;PROGRAM COUNTER

ST	=	177776	;PROCESSOR STATUS REGISTER
SWREG	=	177570	;PROCESSOR SWITCH REGISTER

;	PROGRAM ORGIN

	.TITLE	RDT
	.ABS
.	=	1000
SYSTAK	=	1000
INIT00:	MOV	R3,-(SP)	;SAVE R3 AS GETC CLOBERS IT
	JSR	R5,GETC		;FORCE OUT A CHARACTER
	MOV	(SP)+,R3	;RESTORE R3
INIT:	CMP	GETPTR,PUTPTR	;SEE IF ECHO WAITING
	BNE	INIT00		;BRANCH IF SOME TO DO
	CMPB	R3,#006		;SEE IF FROM PTP
	BEQ	STRT01		;BRANCH IF AN ERROR
	CMPB	R2,#005		;SEE IF OUTPUT TO PTR
	BEQ	STRT01		;BRANCH IF A NUTTY IDEA
	CMPB	R3,#005		;SEE IF FROM PTR
	BNE	INIT20		;BRANCH IF NO I/O
INIT05:	CLR	CKSUM		;CLEAR THE CHECK SUM
	JSR	R5,GETCHR	;GET CHARACTER
INIT06:	DECB	R0		;SEE IF A ONE
	BNE	INIT05		;LOOP IF NOT RIGHT YET
	JSR	R5,GETCHR	;GETHE NEXT CHARACTER
	TSTB	R0		;SEE IF NULL
	BNE	INIT06		;IF NOT NULL THEN CHECK FOR ANOTHER ONE
	MOV	#PTRBUF,R4	;ADDRESS OF THE BUFFER
	JSR	R5,GETWD	;GET THE BYTE COUNT
	CMP	R1,#2054.	;SEE OF FOR US
	BNE	STRT01		;BRANCH IF NOT FOR US
	JSR	R5,GETWD	;GET THE ADDRESS
	MOV	#1024.,-(SP)	;MAKE A COUNTER
INIT10:	JSR	R5,GETWD	;GET A DATA WORD
	MOV	R1,(R4)+	;STORE IT AWAY
	DEC	(SP)		;DECREMENT THE COUNT
	BGT	INIT10		;LOOP I F MANY MORE
	JSR	R5,GETCHR	;GET A CHARACTER
	TSTB	CKSUM		;SEE IF THE READER'S PLAYING GAMES
	BEQ	INIT15		;BRANCH IF OK
	JSR	R5,PRINTL	;PRINT A NASTY MESSAGE
	+	BADCKS		;BOO--HISS!!!!!
	BR	START		;CALL FIELD SERVICE AND FIX THE READER!

STRT01:	JSR	R5,PRINTL	;PRINT MESSAGE AS TO PROBLEMS
	+	BADUNT		;READING A PUNCH REALLY.
	BR	START		;AND CONTINUE

INIT15:	TST	(SP)+		;POP THE COUNTER
INIT20:	ASL	R2		;MAKE INTO A WORD INDEX
	ASL	R3		;AND THE SAME FOR R3
	MOV	BUFF(R2),R2	;GET TO ADDRESS
	MOV	BUFF(R3),R3	;GET THE FROM ADDRESS
	RTS	R5		;AND RETURN
ASKHIM:	JSR	R5,PRINTL	;PRINT THE PROMPTING
	+	FROM		;THE ADDRESS OF THE GOOD WORD
	JSR	R5,INPUTC	;GET A CHARACTER
	SUB	#'0,R2		;MAKE TO BINARY
	BLT	START		;BRANCH IF A ERROR
	CMPB	R2,#006		;SEE IF TOO BIG
	BGT	START		;BRANCH IF AN ERROR
	MOV	R2,SAVEFR	;SAVE THE FROM DEVICE
	JSR	R5,PRINTL	;PRINT THE SECOND MESSAGE
	+	TO		;THE TO: MESSAGE NOW
	JSR	R5,INPUTC	;GET A CHARACTER
	SUB	#'0,R2		;MAKE BINARY(MAYBE)
	BLT	START		;GO TO JAIL DIRECTLY TO JAIL
	CMPB	R2,#006		;THE OTHER LIMIT
	BGT	START		;DO NOT PASS GO DONOT COLLECT $200
	MOV	R2,SAVETO	;SAVE THE TO DEVICE
	MOV	SAVEFR,R3	;AND GET THE FROM DEVICE
	RTS	R5		;AND RETURN
DUMP:	JSR	R5,ASKHIM	;GET THE DEVICES ETC
DUMP01:	CMP	R2,R3		;SEE IF JUNKY
	BEQ	START		;IF THE SAME NO WORK NEEDED
	JSR	R5,INIT		;DO THE DIRTY WORK
	MOV	#1024.,R4	;SET UP THE COUNT
DUMP05:	MOV	(R3)+,(R2)+	;MOVE A WORD
	DEC	R4		;DECREMENT THE COUNT
	BGT	DUMP05		;SOB ON THE NEWER MACHINES--HUH
CLOSE:	CMPB	SAVETO,#006	;SEE IF PTP FOR THE TO
	BLT	START		;BRANCH IF ALL OVER
	MOV	#170.,R1	;NUMBER OF NULL FRAMES FOR LEADER
	CLR	R0		;AND THE VALUE OF A NULL
CLOS00:	JSR	R5,PUNCHR	;PUNCH A FRAME
	DEC	R1		;DECREMENT THE COUNT
	BGT	CLOS00		;BRANCH IF MORE TO DO
	CLR	CKSUM		;CLEAR THE NEW CHECK SUM
	INC	R0		;MAKE INTO A ONE
	JSR	R5,PUNWD	;PUNCH A WORD OF ONE
	MOV	#PTPBUF,R4	;GET THE ADDRESS OF THE BUFFER
	MOV	#2054.,R0	;THE BYTE COUNT
	JSR	R5,PUNWD	;PUNCH THE BYTE COUNT
	MOV	#CTRLST,R0	;THE ADDRESS OF CONTROL STORAGE
	JSR	R5,PUNWD	;PUNCH IT TOO
	MOV	#1024.,R1	;THE WORD COUNT
CLOS05:	MOV	(R4)+,R0	;GET A WORD 
	JSR	R5,PUNWD	;PUNCH IT
	DEC	R1		;AND COUNT DOWN THE COUNTER
	BGT	CLOS05		;AND LOOP FOR MORE IF NECESSARY
	MOVB	CKSUM,R0	;GET THE CHECK SUM
	NEGB	R0		;MAKE IT NEGITIVE OF NEEDED VALUE
	JSR	R5,PUNCHR	;PUNCH IT OUT
	CLR	R0		;NULL TAPE
	JSR	R5,PUNWD
	JSR	R5,PUNWD
	JSR	R5,PUNWD	;SOME SPACE
	INC	R0		;A ONE
	JSR	R5,PUNWD	;NEW BLOCK
	MOV	#6,R0		;BYTE COUNT FOR TRA BLOCK
	JSR	R5,PUNWD	;PUNCH IT ALSO
	MOV	#1,R0		;TRANSFER ADDRESS
	JSR	R5,PUNWD	;PUNCH IT TOO
	MOV	#370,R0		;THE CHECK SUM FOR TRA BLOCK
	JSR	R5,PUNCHR	;PUNCH IT 
	MOV	#170.,R1	;COUNT FOR TWO FOLDS
	CLR	R0		;MORE NULLS FOR TRAILER
CLOS10:	JSR	R5,PUNCHR	;PUNCH A FRAME OF NULL
	DEC	R1		;DECREMENT COUNT
	BGT	CLOS10		;LOOP IF MORE TO DO
	BR	START		;ELSE RETURN
START:	MOV	#SYSTAK,SP	;SET UP A STACK LIKE ALL GOOD PDP-11 PROGRAMS
	JSR	R5,PRINTL	;PRINT OUT THE PROMPTING
	+	PROMPT		;THE PROMPTING STRING
	CLR	R4		;CLEAR THE R0 BACK UP
	CLR	R5		;AND THE R1 BACKUP
SCAN:	CLR	R0		;CLEAR THE FLAGS AND CHARACTER COUNT
SCAN00:	CLR	R1		;CLEAR THE NUMBER TO BE COLLECTED
SCAN05:	JSR	R5,INPUTC	;GET A CHARACTER FROM THE TTY
	SUB	#'0,R2		;CONVERT TO BINARY IF IF A NUMBER
	BLT	SCAN10		;BRANCH IF NOT A NUMBER
	CMPB	R2,#007		;SEE IF A VALID NUMBER
	BGT	SCAN10		;BRANCH IF NOT A NUMBER
	ASL	R1		;MULTIPLY THE OLD NUMBER BY 2
	ASL	R1		;    BY 4
	ASL	R1		;        BY 8 FOR OCTAL
	INC	R0		;COUNT THE DIGIT IN OUR COUNT
	BPL	SCAN02		;BRANCH IF COLLECTING A POSITIVE NUMBER
	NEG	R2		;ELSE MAKE THE DIGIT NEGATIVE
SCAN02:	ADD	R2,R1		;ADD IN THE CURRENT DIGIT
	BR	SCAN05		;AND LOOP FOR MORE

SCAN10:	MOV	#TBLCMD,R3	;PICK UP THE ADDRESS OF THE VALID COMMANDS
SCAN15:	CMPB	R2,(R3)+	;SEE IF IT MATCHES THIS ONE
	BEQ	SCAN20		;BRANCH IF A MATCH FOUND
	TSTB	(R3)		;SEE IF MORE TO DO
	BNE	SCAN15		;LOOP IF NOT ALL DONE
	JSR	R5,PRINTL	;PRINT SOMETHING INDICATIVE
	+	ERMSG		;OF HIS I.Q.
	BR	SCAN05		;AND LOOP TILL MORE EXCITING THINGS HAPPEN

SCAN20:	SUB	#TBLCMD,R3	;COMPUT THE INDEX TO THE JUMP TABLE
	ASL	R3		;MAKE IT INTO A WORD INDEX
	MOV	TBLRTN-2(R3),R3	;AND DISPATCH TO IT
	BEQ	START		;LOOP IF NO PCOMMAND YET
	MOV	R3,PC		;ELSE DISPATCH

SCAN25:	MOV	#100000,R0	;MAKE THE NUMBER NEGATIVE
	BR	SCAN00		;AND RESUME THE SCAN

SCAN30:	MOV	R1,R5		;SAVE THE CURRENT VALUE
	MOV	R0,R4		;ASAVE THE IT'S THERE FLAG
	BR	SCAN
GETC:	TSTB	@KBD		;SEE IF HE STRUCK A KEY
	BMI	GETC05		;BRANCH IF CHARACTER READY
	TSTB	@TTY		;SEE IF PRINTER READY FOR THE NEXT CHARACTER
	BPL	GETC		;BRANCH TO WAIT FOR A HAPPENING
	MOV	GETPTR,R3	;PICK UP THE GET POINTER
	CMP	R3,PUTPTR	;SEE IF ANYTHING IN THE BUFFER
	BEQ	GETC		;BRANCH IF A FALSE ALARM
	MOVB	(R3)+,@TTY+2	;ELSE OUTPUT THE NEXT CHARACTER
	CMP	R3,ENDPTR	;SEE IF WRAP AROUND TIME
	BLOS	GETC01		;BRANCH IF ALL RIGHT
	MOV	BEGPTR,R3	;ELSE MOVE TO THE HEAD OF THE CLASS
GETC01:	MOV	R3,GETPTR	;UPDATE THE POINTER TO SHOW THE LOSS
	RTS	R5		;AND RETURN DOING OUR DUTY

GETC05:	MOVB	@KBD+2,R2	;GET THE CHARACTER AND CLEAR READY
	INC	@KBD		;SET READER RUN
	BIC	#177600,R2	;CLEAR PARITY AND SIDE EFFECT
	SEV			;SHOW CHARACTER COLLECTED
PRNT30:	RTS	R5		;AND RETURN THE CHARACTER

GETC20:	MOV	GETPTR,PUTPTR	;EMPTY THE OLE BUFFER
	JSR	R5,PRINTL	;PRINT ^O TO INFORM HIM
	+	CTRLO		;ADDRESS OF MESSAGE
	BR	START		;AND RESUME

PRINTL:	MOV	(R5)+,R2	;GET THE MESSAGE ADDRESS
	MOV	PUTPTR,R3	;GET THE PUT POINTER
PRNT10:	INC	R3		;GO TO THE NEXT POSSIBLE POSITION
	CMP	R3,ENDPTR	;SEE IF IT'S OUT OF RANGE
	BLOS	PRNT15		;BRANCH IF OK
	MOV	BEGPTR,R3	;ELSE GET THE WRAP AROUND DUDE
PRNT15:	CMP	R3,GETPTR	;SEE IF TOO MUCH JUNK IN THERE
	BEQ	PRNT20		;BRANCH TO IDLE THE PRINTER
	MOVB	(R2)+,@PUTPTR	;STORE THE CHARACTER
	BEQ	PRNT30		;BRANCH IF THE END
	MOV	R3,PUTPTR	;STORE THE UPDATED POINTER
	BR	PRNT10		;AND RETURN FOR MORE

PRNT20:	MOV	R2,-(SP)	;SAVE R2 FOR GETC MIGHT BLOW IT
	JSR	R5,GETC		;IDLE FOR A CHARACTER
	MOV	(SP)+,R2	;GET R2 BACK FOR NOW
	BVS	PRNT20		;BRANCH IF A CHARACTER IS LOST
	BR	PRNT15		;AND LOOP FOR MORE
INPUTC:	JSR	R5,GETC		;GET A CHARACTER
	BVC	INPUTC		;BRANCH IF JUST A CHARACTER ECHO
	CMPB	R2,#040		;SEE IF A CONTROL CHARACTER
	BLT	INPC10		;EXIT NOW IF NON-PRINTING
	CMPB	R2,#140		;SEE IF LOWER CASE
	BGE	INPC10		;EXIT IF LITTLE LETTER
	MOV	PUTPTR,R3	;GET PUT POINTER
	INC	R3		;POP TO NEXT CHARACTER
	CMP	R3,ENDPTR	;SEE IF WRAP AROUND TIME YET
	BLOS	INPC05		;BRANCH IF STILL IN THE BUFFER
	MOV	BEGPTR,R3	;ELSE GET START BUFFER ADDRESS
INPC05:	CMP	R3,GETPTR	;SEE IF ANY ROOM IN THIS BUFFER
	BEQ	INPC10		;IF NO ROOM EXIT NOW
	MOVB	R2,@PUTPTR	;STORE THE CHARACTER
	MOV	R3,PUTPTR	;STORE THE PUT POINTER FOR NEXT TIME
INPC10:	RTS	R5		;RETURN WITH THE CHARACTER

GETWD:	CLR	R1		;THE WORD TO BE
	JSR	R5,GETCHR	;GET THE FIRST FRAME
	BISB	R0,R1		;SET IN THE FIRST ROUND
	SWAB	R1		;END FOR END SHE GOES
	JSR	R5,GETCHR	;GET ANOTHER CHARACTER
	BISB	R0,R1		;SET THE DATA
	SWAB	R1		;BACK TO REAL FORMAT
	RTS	R5		;AND BACK

GETCHR:	INC	@PTR		;READER ENABLE
GETC03:	TSTB	@PTR		;SEE IF DONE YET
	BPL	GETC03		;IF NOT DONE LOOP
	MOV	@PTR+2,R0	;GET THE CHARACTER
	ADD	R0,CKSUM	;ADD IN TO THE RUNNING TOTAL
	RTS	R5		;AND EXIT

PUNWD:	JSR	R5,PUNCHR	;PUNCH THE LOW BYTE
	SWAB	R0		;PUT THE ODD BYTE DOWN LOW

PUNCHR:	TSTB	@PTP		;SEE IF READY
	BPL	PUNCHR		;LOOP TIL DONE
	MOVB	R0,@PTP+2	;PUNCH IT NOW
	CLR	-(SP)		;FOR THE CHECK SUM
	MOVB	R0,(SP)		;ADD TO THE THING
	ADD	(SP)+,CKSUM	;HERE WE GO
	RTS	R5		;AND EXIT
TBLCMD:	.BYTE	' -'0		;SPACE 040
	.BYTE	'	-'0	;TAB 011
	.BYTE	'--'0		;MINUS SIGN
	.BYTE	'/-'0		;SHILLING MARK
	.BYTE	'M-'0		;LETTER M
	.BYTE	'P-'0		;LETTER P
	.BYTE	'V-'0		;LETTER V
	.BYTE	000-'0		;NULL 000
	.BYTE	';-'0		;SEMI-COLON
	.BYTE	177-'0		;RUBOUT 177
	.BYTE	012-'0		;LINE FEED 012
	.BYTE	015-'0		;CARRIAGE RETURN 015
	.BYTE	'X-'0		;LETTER X
	.BYTE	'>-'0		;RIGHT ANGLE BRACKET
	.BYTE	017-'0		;CONTROL O 017
	.BYTE	176-'0		;ONE FORM OF ESC 176
	.BYTE	175-'0		;ANOTHER FORM OF ESC 175
	.BYTE	033-'0		;THE OFFICIAL ESC 033

	.BYTE	0		;THEN END OF THE TABLE!
	.EVEN			;FOR THE SAKE OF  A GOOD ASSEMBLY

TBLRTN:	+	SCAN05		;IGNORE THE SPACES
	+	SCAN05		;IGNORE THE TABS TOO
	+	SCAN25		;ROUTINE FOR -
	+	OCTDSP		;ROUTINE TO DISPLAY 16 BIT OCTAL
	+	DUMP		;ROUTINE TO DUMP ROM STORAGE FIELD
	+	PRINT		;ROUTINE TO PRINT ROM STORAGE FIELD
	+	VERIFY		;ROUTINE TO VERIFY ROM FIELDS
	+	SCAN05		;IGNORE NULLS TOO
	+	SCAN30		;ROUTINE TO CHANGE FIELDS
	+	START		;ROUTINE TO SCRUB ALL TYPE IN SO FAR
	+			;ROUTINE TO DISPLAY NEXT LOCATION
	+			;ROUTINE TO CLOSE OPEN CELL
	+	ROMDSP		;ROUTINE TO DISPLAY ROM WORD
	+			;OPEN RELATED U WORD
	+	GETC20		;ROUTINE TO KILL BUFFERED TYPE OUT
	+			;ROUTINE TO HANDLE ESC
	+			;ROUTINE TO HANDLE ESC
	+			;ROUTINE TO HANDLE ESC

;	MISC SAVED VALUES

CKSUM:	.WORD	0		;CHECK SUM FROM OR TO PAPER TAPE
SAVEFR:	.WORD	0		;SAVE CELL FOR FROM DEVICE
SAVETO:	.WORD	0		;SAVE CELL FOR TO DEVICE

BUFF:	.WORD	CTRLST		;CONTROL STORAGE
	.WORD	SAVRM1		;CORE ROM 1
	.WORD	SAVRM2		;CORE ROM 2
	.WORD	SAVRM3		;CORE ROM 3
	.WORD	SAVRM4		;CORE ROM 4
	.WORD	PTRBUF		;PTR BUFFER
	.WORD	PTPBUF		;PTP BUFFER=PTR BUFFER


;	TELETYPE BUFFER AND CONTROL PARAMETERS

PTR:	+	177550		;PAPER TAPE STATUS REGISTER
	+	177552		;PAPER TAPE DATA REGISTER
PTP:	+	177554		;PAPER TAPE PUNCH STATUS REGISTER
	+	177556		;PAPER TAPE PUNCH DATA REGISTER
KBD:	+	177560		;KEYBOARD STATUS REGISTER
	+	177562		;KEYBOARD DATA REGISTER
TTY:	+	177564		;PRINTER STATUS REGISTER
	+	177566		;PRINTER DATA REGISTER

BEGPTR:	+	BUFFER		;START OF THE BUFFER
GETPTR:	+	BUFFER		;CURRENT GET POINTER
PUTPTR:	+	BUFFER		;CURRENT PUT POINTER
ENDPTR:	+	BUFFER+BUFLEN	;END ADDRESS OF BUFFER

BUFLEN	=	100.		;100. CHARACTERS

BUFFER:	.BYTE	0

.	=	.+BUFLEN	;RESERVE THE SPACE

ERMSG:	.BYTE	'?,0		;WHAT?
CTRLO:	.BYTE	'^,'O,015,012,0	;^O MESSAGE
PROMPT:	.BYTE	015,012,'<,015,'>,0	;GET WITH IT BABY!
FROM:	.BYTE	015,012,'F,'R,'O,'M,':,' ,0
TO:	.BYTE	' ,'T,'O,':,' ,0
BADCKS:	.ASCII	%BAD CHECK SUM TAPE IGNORED%
CRLF:	.BYTE	015,012,0
BADUNT:	.ASCII	%  ILLEGAL COMBINATION%
	.BYTE	015,012,0
	.EVEN			;SO AS TO BE WORD ALLIGNED


PTRBUF	=	.		;READER/PUNCH BUFFER
	.=	.+2048.	;1000 WORDS

PTPBUF	=	PTRBUF		;SAVE CORE HOW ABOUT THAT

SAVRM1	=	.
SAVRM2	=	SAVRM1+2048.
SAVRM3	=	SAVRM2+2048.
SAVRM4	=	SAVRM3+2048.
CTRLST	=	40000

VERIFY	=	START
ROMDSP	=	START
PRINT	=	START
OCTDSP	=	START
	.END			;THAT'S ALL NOW START HER UP FOLKS
   